本文档面向 EOELAB 用户,说明如何注册账户、接入联邦网络并使用计算和对象存储等联邦设施。维护者同样先以用户身份完成账户和网络接入,再参考《EOELAB 运维手册》部署和维护设施。
成员可以立即将设备加入联邦网络。成员身份提供网络接入资格,不自动授予 Incus 资源、RustFS 数据或 Headplane 管理权限;这些能力继续由对应服务管理。
HEADSCALE_ENDPOINT='<HEADSCALE_ENDPOINT>'
sudo tailscale up --login-server "$HEADSCALE_ENDPOINT"
tailscale status 确认设备在线节点加入后使用自动生成的 HOSTNAME.eoelab 名称通信。重装系统或清除 Tailscale 状态后需要重新注册。
在云服务器上激活客户端后,内部镜像域名可能解析到 CGNAT 地址。如软件源不可用,可临时改用公网站点,例如 USTC 镜像源。
用户可以打开《EOELAB 服务端点》列出的 Headplane,查看和管理自己有权操作的节点。网络管理角色、能力和限制统一参见《EOELAB 权限模型》。
Incus 使用 Zitadel OIDC 登录,并通过 OpenFGA 控制用户可以访问的项目、实例和其他资源。Incus Web UI 是公网管理入口;节点 SSH、实例 proxy 端口和其他节点直连入口只在联邦网络内提供。角色和细粒度权限说明参见《EOELAB 权限模型》。
.eoelab 节点名称和分配端口连接service ssh start/usr/sbin/sshd默认不允许在 LXC 中嵌套运行 OCI 容器。容器化服务应直接以 OCI 实例运行在 Incus 上,并使用 Incus 网络通信。CI/CD 构建镜像时可以使用 Kaniko。
EOELAB 对象存储由 RustFS 提供,兼容 S3,并提供 Console 和 WebDAV 接口。具体地址统一参见《EOELAB 服务端点》。Console 是公网管理入口;S3 和 WebDAV 只通过联邦网络提供,使用前必须先接入 Tailscale。
Console 中创建的 Access Key 是独立的长期凭证,用于 rc、S3 SDK 和 WebDAV。Secret Key 通常只在创建时显示一次,应立即存入密码管理器。
每个用户只能管理以下名称的 Bucket:
<sub>
<sub>-*
sub 是 Zitadel 为账户分配的稳定用户 ID,可以在 Zitadel 用户资料中查看,或向 admin 团队查询。例如 sub 为 123456 时,可以创建 123456、123456-backup 和 123456-project-a,不能创建 backup。
Bucket 名称必须符合 S3 命名规则:使用小写字母、数字、点和连字符,不能包含空格或下划线。
Access KeysAccess Key 继承当前用户的权限边界。即使为 Access Key 配置额外策略,也不能突破用户自己的 Bucket 范围。
从 https://github.com/rustfs/cli/releases 下载与操作系统和处理器架构匹配的发布包。以 Linux amd64 为例:
tar -xzf rustfs-cli-linux-amd64-vVERSION.tar.gz
sudo install -m 0755 rc /usr/local/bin/rc
rc --version
将 VERSION 替换为下载的版本号。安装后的命令名为 rc。
接入联邦网络后,从《EOELAB 服务端点》取得 RustFS S3 地址,并使用 Console 创建的 Access Key 和 Secret Key 配置别名:
S3_ENDPOINT='<S3_ENDPOINT>'
rc alias set oss "$S3_ENDPOINT" ACCESS_KEY SECRET_KEY
不要将包含真实 Secret Key 的命令提交到 Shell 脚本、Git 仓库、工单或聊天记录中。
常用操作:
# 列出可访问的 Bucket
rc ls oss/
# 创建 Bucket
rc mb oss/SUB
rc mb oss/SUB-project
# 上传文件或目录
rc cp ./example.txt oss/SUB-project/
rc cp -r ./dataset/ oss/SUB-project/dataset/
# 下载文件
rc cp oss/SUB-project/example.txt ./example.txt
# 删除空 Bucket
rc rb oss/SUB-project
将示例中的 SUB 替换为自己的 Zitadel sub。
Access Key 到期后立即停止认证。RustFS 在后续加载该身份时自动删除过期的 Service Account 记录和关联策略,因此正常轮换可以通过设置有效期完成,不需要在到期后手动清理服务端记录。
需要提前撤销时,先查看自己名下的 Access Key:
rc admin service-account ls oss
删除指定 Access Key:
rc admin service-account rm oss ACCESS_KEY
如果删除的是当前 oss Alias 使用的 Access Key,服务端删除成功后再清理本地 Alias:
rc alias remove oss
rc alias remove 只删除本地配置,不会撤销 RustFS 服务端凭证。必须先执行 rc admin service-account rm,再删除本地 Alias。
支持自定义 S3 Endpoint 的客户端使用以下配置:
Endpoint: <S3_ENDPOINT>
Access Key: Console 创建的 Access Key
Secret Key: Console 创建的 Secret Key
Region: us-east-1
Path Style: 按客户端兼容性需要启用
TLS: 关闭;应用流量由 Tailscale 加密
S3 不提供公网端点。流量通过 Tailscale 网络传输,应用身份认证仍由 Access Key 和 Secret Key 完成。
接入联邦网络后,从《EOELAB 服务端点》取得 WebDAV 地址。用户名填写 Access Key,密码填写 Secret Key。WebDAV 不提供公网端点,也不支持 OIDC/STS 临时凭证,因为 Basic Auth 无法携带 Session Token。
建议在连接地址中显式填写 Access Key,避免客户端继续使用缓存的旧用户名:
http://<ACCESS_KEY>@oss.eoelab:8080/[<BUCKET>/]
[<BUCKET>/] 表示可选路径。省略时从 WebDAV 根目录开始并列出当前 Access Key 可访问的 Bucket;填写时直接进入指定 Bucket。由于 Access Key 已经作为用户名写入地址,客户端可能只显示密码输入框,此时填写对应的 Secret Key 即可。
WebDAV 根路径列出当前 Access Key 可访问的 Bucket,Bucket 和对象路径对应如下:
http://<ACCESS_KEY>@oss.eoelab:8080/ Bucket 列表
http://<ACCESS_KEY>@oss.eoelab:8080/<BUCKET>/ 指定 Bucket
http://<ACCESS_KEY>@oss.eoelab:8080/<BUCKET>/<OBJECT> 指定对象
不要直接用网页浏览器验证 WebDAV。浏览器访问根地址时发送普通 GET /,服务端返回 405 Method Not Allowed 属于正常现象。可以使用以下命令验证;命令会交互式询问 Secret Key,避免将其写入 Shell 历史:
ACCESS_KEY='<ACCESS_KEY>'
curl --user "$ACCESS_KEY" -X PROPFIND -H 'Depth: 1' '<WEBDAV_ENDPOINT>/'
成功时返回 207 Multi-Status。常见客户端配置如下:
| 客户端 | 地址 | 认证 |
|---|---|---|
| GNOME Files | 将 <WEBDAV_ENDPOINT> 的 http:// 替换为 dav://,并在主机名前加入 <ACCESS_KEY>@;Bucket 路径可选 | 地址中提供 Access Key,密码为 Secret Key |
| macOS Finder | 在 <WEBDAV_ENDPOINT> 的主机名前加入 <ACCESS_KEY>@;Bucket 路径可选 | 地址中提供 Access Key,密码为 Secret Key |
| Windows、Cyberduck、rclone 等 | WebDAV 地址可填写根路径或指定 Bucket 路径 | 显式将 Access Key 设为用户名,Secret Key 设为密码 |
只读 Access Key 可以列目录和下载对象,不能上传、创建目录、重命名或删除。WebDAV 的 HTTP 明文流量由 Tailscale 加密,仍须使用 Access Key 和 Secret Key 完成应用身份认证。
获得相应权限的用户可以在 Console 的 S3 Tables 页面启用自己的 Bucket,并管理 Namespace、Table 和 View。Table 操作仍受 <sub> 和 <sub>-* 的 Bucket 边界限制。
第一次访问对象存储时,必须先创建一个符合命名规则的 Bucket,再执行 rc ls oss/。如果当前 Access Key 尚无可访问的 Bucket,直接执行 rc ls oss/ 会报错。
rc mb oss/SUB
rc ls oss/
将 SUB 替换为自己的 Zitadel sub。
如果客户端配置了 HTTP 代理,.eoelab 请求可能被错误发送到代理。将内部域名加入代理绕过列表:
export NO_PROXY=",}.eoelab"
export no_proxy=",}.eoelab"
可以使用以下命令进行单次验证:
NO_PROXY='*' no_proxy='*' rc ls oss/
依次检查:
<sub> 或 <sub>-*检查 Endpoint、Access Key、Secret Key 和系统时间。复制凭证时不要包含额外空格或换行。
当前 Console 可能无法识别包含动态用户变量的 Bucket Resource。可以改用 rc mb 创建符合命名规则的 Bucket;后端仍会执行完整的权限检查。
EOELAB 提供 Docker Hub 镜像入口,具体地址参见《EOELAB 服务端点》。由于 Cloudflare Worker 的匿名拉取额度已经达到上限,使用该入口前必须通过 Docker Hub 账户登录,不支持匿名拉取。
docker login dhcr.eoelab.org
按提示输入 Docker Hub 用户名和密码或 Access Token。这里使用的是 Docker Hub 账户,不是 EOELAB Zitadel 账户。
connections:
forgejo:
url: https://codeberg.org/
uuid: UUID
token: TOKEN
实际注册时,维护者会将 forgejo 替换为申请人的用户名,用于内部区分并避免同名 key 冲突。
EOELAB 不支持静默退出。需要退出时向 admin 团队发送退出申请,并提前说明需要导出的配置和数据。admin 团队将移除账户、节点和联邦权限,并与用户确认必要的数据交付和清理范围。
长期失联或存在安全风险的账户和节点可能被强制移除。